#include <bits/stdc++.h>

using namespace std;

const int maxn=1005;
const int maxm=3005*2;
const int maxs=1<<12;
const int inf=0x3f3f3f3f;

struct Q{
    int q[maxn];bool inq[maxn];
    int f,r;
    Q():f(0),r(0){memset(inq,0,sizeof inq);}
    inline const bool hasElement() const{return f!=r;}
    inline void push(const int &p){
        if(!inq[p]){
            inq[q[r++]=p]=1;
            if(r>=maxn) r%=maxn;
        }
    }
    inline int pop(){
        int p;
        inq[p=q[f++]]=0;
        if(f>=maxn) f%=maxn;
        return p;
    }
};

int f[maxn][maxs],ans[maxs];
int g[maxn],v[maxm],w[maxm],nxt[maxm];
int c[maxn],cntC[15],trans[15],pos[maxn];
int cpt[15]; //ColoredPoints
int n;
Q q;

inline void addEdge(const int &x,const int &y,const int &z){
    static int en=0;
    v[en]=y;w[en]=z;nxt[en]=g[x];g[x]=en++;
    v[en]=x;w[en]=z;nxt[en]=g[y];g[y]=en++;
}

inline void spfa(const int &s){
    while(q.hasElement()){
        int p=q.pop();
        for(int j=g[p];~j;j=nxt[j]){
            const int &tar=v[j];
            if(f[tar][s]>f[p][s]+w[j]){
                f[tar][s]=f[p][s]+w[j];
                q.push(tar);
            }
        }
    }
}

inline void steiner(const int &cnt){
    for(int s=1,end=1<<cnt;s<end;s++){
        for(int i=1;i<=n;i++){
            for(int k=s&s-1;k;k=s&k-1)
                if(f[i][s]>f[i][k]+f[i][s-k]) f[i][s]=f[i][k]+f[i][s-k];
            if(f[i][s]!=inf) q.push(i);
        }
        spfa(s);
    }
}

template <typename T> inline void read(T &r){
    char ch;bool neg=0;
    for(ch=getchar();ch>'9'||ch<'0';ch=getchar()) if(ch=='-') neg=1;
    for(r=0;ch<='9'&&ch>='0';ch=getchar()) r=r*10+ch-'0';
    if(neg) r=-r;
}

int main(){
    int m,p,cnt;

    read(n);read(m);read(p);
    memset(g,-1,sizeof g);
    while(m--){
        int x,y,z;
        read(x);read(y);read(z);
        addEdge(x,y,z);
    }
    memset(c,-1,sizeof c);
    for(int i=0;i<p;i++){
        int x,y;
        read(x);read(y);
        c[y]=x;
        cntC[x]++;
        cpt[i]=y;
    }

    int _p=p;p=0;
    for(int i=0;i<_p;i++) if(cntC[c[cpt[i]]]>1) cpt[p++]=cpt[i];
    cnt=0;
    memset(trans,-1,sizeof trans);
    for(int i=0;i<p;i++)
        if(~trans[c[cpt[i]]]) c[cpt[i]]=trans[c[cpt[i]]];
        else{
            trans[c[cpt[i]]]=cnt++;
            c[cpt[i]]=trans[c[cpt[i]]];
        }

    memset(f,0x3f,sizeof f);
    for(int i=0;i<p;i++) f[cpt[i]][1<<i]=0;
    steiner(p);

    //printf("p=%d,cnt=%d\n",p,cnt);
    for(int i=0;i<p;i++) c[cpt[i]]=1<<c[cpt[i]];
    for(int s=1,end=1<<cnt;s<end;s++){
        int mask=0,repr;
        for(int i=0;i<p;i++) if(c[cpt[i]]&s) mask|=1<<i,repr=cpt[i];
        //printf("s=%d,repr=%d,mask=%d\n",s,repr,mask);
        ans[s]=f[repr][mask];
        for(int k=s&s-1;k;k=s&k-1) ans[s]=min(ans[s],ans[k]+ans[s-k]);
    }
    printf("%d\n",ans[(1<<cnt)-1]);
    return 0;
}

